<?php
namespace Kuoqi;

use Kuoqi;
use Kuoqi\Error;
use Kuoqi\Params;
use Kuoqi\Route;
use Kuoqi\FileDriver;
use Kuoqi\Cache;
/**
 * Class Controller.class
 * @package Kuoqi
 * User kuoqi
 * Datetime 2022/2/28 11:10
 * Remark 核心组键 - 用户控制器基础的实现内容,本模块所有信息都是操作当前注册在kuoqi下面的app的信息来达到目的
 */
class Controller{
    /**
     * 控制器的权限maps
     * @var array
     * protected $action_maps = array(
        'title'=>'管理员管理',
        'list'=>array(
            'index'=>'列表',
            'edit'=>'增加/编辑',
            'del'=>'删除',
         ),
       );
     */
    protected $action_maps = array();
    /**
     * 配置app 最终只输出当前的片段内容
     * vbase
     * @param string $templateId
     * @param array $templateParams
     * @return string
     * @throws \Kuoqi\Error
     */
    protected function renderPartial($templateId = '',$templateParams = array()){
        //首先第一步，补全app路由信息
        $route = Kuoqi::$app->perfectViewpath($templateId);
        Kuoqi::$app->layout_id = false;//关闭layout
        Kuoqi::$app->use_view = true;//开启view模块
        //尝试返回这个模块的数据信息
        Kuoqi::$app->path_viewer = $route;
        //使用模块进行解析内容片段
        //获取文件路劲
        $fname = $route.Params::$VIEW_EXT;
        //根据文件名获取文件的内容,调用模块
        $file = new FileDriver($fname);
        $filecontent = $file->getContent();//获取文件内容
        if(!$file->isValied()){
            throw new Error($file->getError());
        }
        $stream = Interpreter::execCode($filecontent,Kuoqi::$app->getAssigns($templateParams));

        //设置cache模块缓存
        $tpid = Cache::setTemplate($stream);
        $stream = Cache::getTemplate($tpid,Kuoqi::$app->getAssigns($templateParams));
        return trim($stream);
    }

    /**
     * 配置输出完整版数据内容
     * vbase
     * @param string $templateId
     * @param array $templateParams
     * @return string
     * @throws \Kuoqi\Error
     */
    protected function render($templateId = '',$templateParams = array()){
        //首先第一步，补全app路由信息
        $route = Kuoqi::$app->perfectViewpath($templateId);
        //Kuoqi::$app->use_layout = false;//关闭layout
        Kuoqi::$app->use_view = true;//开启view模块
        //尝试返回这个模块的数据信息
        Kuoqi::$app->path_viewer = $route;
        //使用模块进行解析内容片段
        //获取文件路劲
        $fname = $route.Params::$VIEW_EXT;

        //根据文件名获取文件的内容,调用模块
        $file = new FileDriver($fname);
        $filecontent = $file->getContent();//获取文件内容
        if(!$file->isValied()){
            throw new Error($file->getError());
        }
        $stream = Interpreter::execCode($filecontent,Kuoqi::$app->getAssigns($templateParams));
        //设置cache模块缓存
        $tpid = Cache::setTemplate($stream);
        $stream = Cache::getTemplate($tpid,Kuoqi::$app->getAssigns($templateParams));
        return trim($stream);
    }

    /**
     * 配置输出完整版数据内容
     * vbase
     * @param string $templateId
     * @param array $templateParams
     * @return string
     * @throws \Kuoqi\Error
     */
    protected function display($templateId = '',$templateParams = array()){
        return $this->render($templateId = '',$templateParams = array());
    }

    /**
     * @param $args
     * @param null $extArgs
     * User kuoqi
     * Datetime 2022/3/1 16:11
     * Remark 配置模板替换参数信息模块
     */
    protected function assign($args,$extArgs = null){
        Kuoqi::$app->setAssign($args,$extArgs);
    }

    //直接展示内容信息
    protected function show($msg){
        echo sprintf('<div>%s</div>',$msg);
    }

    /**
     * 执行成功中间页或者中间json
     * @param string $msg
     * @param int $timer
     * @param null $url
     * @throws \Kuoqi\Error
     */
    protected function success($msg = 'ok',$timer = 3,$url = null){
        //todo--success
        throw new Error('执行跳转成功页面暂无');
    }

    /**
     * 执行失败中间页或者中间json
     * @param string $msg
     * @param int $timer
     * @param null $url
     * @throws \Kuoqi\Error
     */
    protected function error($msg = 'error',$timer = 3,$url = null){
        throw new Error($msg);
    }

    /**
     * 重定向到某个页面
     * createby kuoqi at 2022/8/24 11:07
     * @param $url
     * @param bool $isComplex
     * @throws \Kuoqi\Error
     */
    protected function redirect($url,$isComplex = false){
        $isComplex||$url = \Kuoqi\Helper::url($url);
        @header('location:'.$url);die();
    }

    /**
     * @param $config
     * @param null $message
     * @param array $data
     * @return string
     * User kuoqi
     * Datetime 2022/3/1 17:41
     * Remark 初始化json返回
     */
    public function jsonReturn($config,$message = NULL,$data = array())
    {
        //配置layout为空
        Kuoqi::$app->layout_id = false;
        Kuoqi::$app->setFormat('json_string');
        if(is_int($config)||is_string($config)){
            $config = $this->arrReturn($config,$message,$data);
        }
        if(PHP_VERSION>='5.5'){
            $config = json_encode($config,JSON_UNESCAPED_UNICODE);
        }else{
            $config = json_encode($config);
        }
        return $config;
    }

    /**
     * 初始化jsonp
     * createby kuoqi at 2022/8/24 11:06
     * @param $config
     * @param null $message
     * @param array $data
     * @return string
     * @throws \Kuoqi\Error
     */
    public function jsonpReturn($config,$message = NULL,$data = array())
    {
        if(is_int($config)){
            $config = $this->arrReturn($config,$message,$data);
        }
        $data = json_encode($config);
        $callback = I('request.callback','handleResponse');
        $string = "{$callback}({$data})";
        return $string;
    }

    /**
     * @param int $status
     * @param string $message
     * @param array $data
     * @return array
     * User kuoqi
     * Datetime 2022/3/1 17:42
     * Remark arr Return
     */
    public function arrReturn($status = 1,$message = '',$data = array())
    {
        $output = array('status'=>$status,'message'=>$message);
        if($status){
            if($status==9){
                $output['url'] = $data;
            }else{
                $output['data'] = $data;
            }
        }
        return $output;
    }

    /**
     * @param $layoutId
     * User kuoqi
     * Datetime 2022/3/1 16:01
     * Remark 初始化layout相关信息
     */
    protected function layout($layoutId){
        if($layoutId){
            Kuoqi::$app->layout_id = Kuoqi::$app->perfectViewpath($layoutId);
        }else{
            Kuoqi::$app->layout_id = false;
        }

    }

    /**
     * @return bool
     * User kuoqi
     * Datetime 2022/2/28 14:49
     * Remark 判定请求方式是否为get
     */
    protected function isGet(){
        return (Kuoqi::$app->route->method=='GET')?true:false;
    }

    /**
     * @return bool
     * User kuoqi
     * Datetime 2022/2/28 14:49
     * Remark 判定请求方式是否为post
     */
    protected function isPost(){
        return (Kuoqi::$app->route->method=='POST')?true:false;
    }

    protected function app(){
        return \Kuoqi::$app;
    }

    /**
     * 退出
     * @throws \Kuoqi\Error
     */
    protected function quit($msg){
        $error = new \Kuoqi\Error($msg);
        $error->quit_active();
    }

    public function __call($name, $arguments)
    {
        // TODO: 进入到这里面了，然后是尝试调用模板，还是进行其它操作都在这里面来进行
        throw new \Kuoqi\Error('找不到执行方法['.$name.']');
    }
}